
It is surprising that Donald J Trump became the US president last year. He made hard work of beating Hilary Clinton and has almost finished his first year in office. People seem like getting adapted to this new president, but will he win again?
In this analysis, we select presidents’ first inaugural speeches to track whether these speeches indicate a second term of office. By comparing the different patterns between presidents with 2 or more terms and those who only have 1 term in office, we will get some interesting facts about these groups and we can also use the pattern extracted anticipating the future of Trump.
Also, some people believe that Trump is not that special as a Republican president. When George Bush was in his term, he also did something laughable in public. So, we will take this factor into consideration and further break the data into democratic presidents and republican presidents.
0 - Check and install needed packages. Arrange the data. Load the libraries and functions.
This notebook was prepared with the following environmental settings.
print(R.version)
_
platform x86_64-apple-darwin13.4.0
arch x86_64
os darwin13.4.0
system x86_64, darwin13.4.0
status
major 3
minor 3.2
year 2016
month 10
day 31
svn rev 71607
language R
version.string R version 3.3.2 (2016-10-31)
nickname Sincere Pumpkin Patch
1 - WordCloud
###first_term_demo subset of inaug list
###first_demo name
###tdm_first_demo tdm file
###WordCloud plot
###all
#op = par(mfrow=c(1,2),mar = c(0, 0, 3, 0))
par(mfrow=c(3,2))
wordcloud(tdm_first$term, tdm_first$count,
scale=c(2,0.5),
max.words=50,
min.freq=1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9,"Reds"))
title(main = '1 term Presidents')
wordcloud(tdm_second$term, tdm_second$count,
scale=c(2,0.5),
max.words=50,
min.freq=1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9,"Purples"))
title(main = '2 or more term Presidents')
###demo
wordcloud(tdm_first_demo$term, tdm_first_demo$count,
scale=c(2,0.5),
max.words=50,
min.freq=1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9,"Reds"))
title(main = 'Democratics only have one term')
wordcloud(tdm_second_demo$term, tdm_second_demo$count,
scale=c(2,0.5),
max.words=50,
min.freq=1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9,"Purples"))
title(main = 'Democratics have two or more terms')
###repub
wordcloud(tdm_first_repub$term, tdm_first_repub$count,
scale=c(2,0.5),
max.words=50,
min.freq=1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9,"Reds"))
title(main = 'Republican with only one term')
wordcloud(tdm_second_repub$term, tdm_second_repub$count,
scale=c(2,0.5),
max.words=50,
min.freq=1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9,"Purples"))
title(main = 'Republican with two or more terms')

All groups have their own special WordClouds, but we still can find some differences between one-term and two-term presidents:
- One-term presidents regardless of party have more words that people are generally more interested in. “employee”,“business”,“america” are the words that people generally think will appear in inaugural speeches, so it seems that one-term presidents tend to ingratiate citizens by talking things that are more realistic.
- Two-term presidents regardless of party have more words of abstract things. Words like “stricken”,“productivity” and “minority” do not relate to general citizens’ daily life that much, but presidents talk more about those eventually get their second term.
- It is possible that people will place more hopes on presidents that promise to improve economics or bring more jobs. However, it is not easy to actually achieve economic prosperity as it will always be affected by many complicated factors. People might be disappointed after they finish their first term. On comparison, presidents talk less might gain less pressure.
###trump
wordcloud(tdm.trump$term, tdm.trump$count,
scale=c(2,0.5),
max.words=50,
min.freq=1,
random.order=FALSE,
rot.per=0.3,
use.r.layout=T,
random.color=FALSE,
colors=brewer.pal(9,"Oranges"))
title(main = 'Trump ')

Trump has a relatively special WordCloud as he talks a lot about Obama. From the WordCloud, Trump have words like “america”, “dreams”, “”jobs" indicating that he talks more about how to make America thrive again and how to bring more jobs. Trump gains lots of support from blue-collars who place hope of changing their living status, but it might not benefit him when running for his second term.
2 - Length of Sentences
###sentence.list sentence list of all file in dir
###sentence.list.all sentence list of all file group by one-term and second-term
###setence.list.demo
###setence.list.repub
###all
sentence.list.all=filter(sentence.list, File%in%c(first_term$File,second_term$File))
sentence.list.all$Group=ifelse(sentence.list.all$File%in%first_term$File,"first","second")
#sentence.list.all$avg.word<-ifelse(sentence.list.all$Group=="first",sentence.list.all$word.count/length(first),sentence.list.all$word.count/length(second))
beeswarm(word.count~Group,
data=sentence.list.all,
horizontal = FALSE,
pch=16, col=c("red","purple"),
cex=0.8, cex.axis=1, cex.lab=1.2,
las=2,ylab="Number of words",
xlab="",las=1,
main="Inauguartion speeches")

###demo
sentence.list.demo=filter(sentence.list, File%in%c(first_term_demo$File,second_term_demo$File))
sentence.list.demo$Group=ifelse(sentence.list.demo$File%in%first_term_demo$File,"first_demo","second_demo")
#sentence.list.demo$avg.word<-ifelse(sentence.list.demo$Group=="first_demo",sentence.list.demo$word.count/length(first_demo),sentence.list.demo$word.count/length(second_demo))
beeswarm(word.count~Group,
data=sentence.list.demo,
horizontal = FALSE,
pch=16, col=c("red","purple"),
cex=0.8, cex.axis=1, cex.lab=1.2,
las=2,ylab="Number of words",
xlab="",las=1,
main="Inauguartion speeches")

###repub
sentence.list.repub=filter(sentence.list, File%in%c(first_term_repub$File,second_term_repub$File))
sentence.list.repub$Group=ifelse(sentence.list.repub$File%in%first_term_repub$File,"first_repub","second_repub")
#sentence.list.repub$avg.word<-ifelse(sentence.list.repub$Group=="first_repub",sentence.list.repub$word.count/length(first_repub),sentence.list.repub$word.count/length(second_repub))
beeswarm(word.count~Group,
data=sentence.list.repub,
horizontal = FALSE,
pch=16, col=c("red","purple"),
cex=0.8, cex.axis=1, cex.lab=1.2,
las=2,ylab="Number of words",
xlab="",las=1,
main="Inauguartion speeches")

Only first inaugural speeches are picked. There are 23 one-term presidents vs 17 second-term presidents; 9 one-term democratic presidents vs 6 two-term democratic presidents; 10 one-term republican presidents vs 7 two-term republican presidents. As the number of presidents in each group differ, the analysis become more complicated. However, we can still see some patterns:
- All presidents will have more sentences with length around 20, have similar shape of distribution of sentence length.
- Two-term presidents tends to have relatively more number of sentence. We can see it through the first plot. Although there are 23 one-term presidents but 17 two-term presidents, there is no significant less sentences in two-term presidents.
- Two-term democratic presidents have more even structure of sentence length compared to one-term democratic presidents. However, two-term republican presidents have less even structure compared to one-term republican presidents.
###Trump
sentence.to=filter(sentence.list, File%in%c("DonaldJTrump","BarackObama"))
sentence.to$Group=ifelse(sentence.to$File=="DonaldJTrump","Trump","Obama")
beeswarm(sentence.to$word.count~Group,
data=sentence.to,
horizontal = FALSE,
pch=16, col=brewer.pal(3,"Dark2"),
cex=0.8, cex.axis=1, cex.lab=1.2,
las=2,ylab="Number of words",
xlab="",las=1,
main="Inauguartion speeches")

Compared to Obama’s first-term inaugural speech, Trump has some extra long sentences. Trump has a specially even structure of sentence length which is closest the one-term republican presidents compared to other groups.
3 - Sentiment
par(mfrow=c(3,2))
emo.barplot<-function(group,data){
par(mar=c(4, 6, 2, 1))
emo.means=colMeans(select(subset(data,data$Group==group), anger:trust)>0.01,na.rm=TRUE)
barplot(emo.means, las=2, col=brewer.pal(8,"Set3"), horiz=T,border=F,main=group)
}
###all
emo.barplot("first",sentence.list.all)
emo.barplot("second",sentence.list.all)
###demo
emo.barplot("first_demo",sentence.list.demo)
emo.barplot("second_demo",sentence.list.demo)
###repub
emo.barplot("first_repub",sentence.list.repub)
emo.barplot("second_repub",sentence.list.repub)

We can see that the distributions of emotions are similar among those groups:
- The difference between joy and fear has its own distinct pattern: From all three groups of comparisons, we can see that presidents with 2 or more terms will have closer amount of emotion cores between joy and fear, which is to say that the difference between these two emotions becomes smaller.
- Generally, two-term presidents will have more emotion of sadness compared to surprise, but one-term republican is an exception. For one-term republican presidents, they have weigh more emotion of sadness.
###Trump
emo.means=colMeans(select(subset(sentence.list.all,sentence.list.all$President=="Donald J. Trump"), anger:trust)>0.01,na.rm=TRUE)
barplot(emo.means, las=2, col=brewer.pal(8,"Set3"), horiz=T,border=F, main="Donald J. Trump")

Trump has relatively large difference between joy and fear and less emotion of fear in his inaugural speech, but he has far less emotion of sadness compared to surprise in his speech. From the joy and fear pattern, Trump has greater possibility to be a one-term president, but he also gets the change to be two-term president from sadness and surprise pattern.
4 - Conclusion

We can see that there are some special patterns between one-term presents and two-term president. Only through the analysis above, I will anticipate that Trump will not have his second term:
- A Word Cloud more like a one-term democratic president
- Even structure of word length in sentences more like a one-term republican president
- Relatively large amount of difference between fear and joy
However, until now there is not yet a strong competitors appearing, and even well-designed polls cannot give a exact anticipation of election result. I believe we cannot make a conclusion by only referencing inaugural speeches, but it is still fun to see this kind of the analysis.
Ci0tLQp0aXRsZTogIkRvZXMgVHJ1bXAncyBpbmF1Z3VyYWwgc3BlZWNoIGluZGljYXRlIGhpcyBzZWNvbmQgdGVybSBpbiBvZmZpY2U/IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpcClwKCiFbXShodHRwczovL2kucGluaW1nLmNvbS83MzZ4LzEzL2M3LzM2LzEzYzczNmZmNDllNjNmMzFjNTExN2E4NGVmYWZkYWY1LS1saXN0LW9mLXByZXNpZGVudHMtdmVuZGV0dGEuanBnKXt3aWR0aD01MCV9CgpcCgpJdCBpcyBzdXJwcmlzaW5nIHRoYXQgRG9uYWxkIEogVHJ1bXAgYmVjYW1lIHRoZSBVUyBwcmVzaWRlbnQgbGFzdCB5ZWFyLiBIZSBtYWRlIGhhcmQgd29yayBvZiBiZWF0aW5nIEhpbGFyeSBDbGludG9uIGFuZCBoYXMgYWxtb3N0IGZpbmlzaGVkIGhpcyBmaXJzdCB5ZWFyIGluIG9mZmljZS4KUGVvcGxlIHNlZW0gbGlrZSBnZXR0aW5nIGFkYXB0ZWQgdG8gdGhpcyBuZXcgcHJlc2lkZW50LCBidXQgd2lsbCBoZSB3aW4gYWdhaW4/CgpJbiB0aGlzIGFuYWx5c2lzLCB3ZSBzZWxlY3QgcHJlc2lkZW50cycgZmlyc3QgaW5hdWd1cmFsIHNwZWVjaGVzIHRvIHRyYWNrIHdoZXRoZXIgdGhlc2Ugc3BlZWNoZXMgaW5kaWNhdGUgYSBzZWNvbmQgdGVybSBvZiBvZmZpY2UuCkJ5IGNvbXBhcmluZyB0aGUgZGlmZmVyZW50IHBhdHRlcm5zIGJldHdlZW4gcHJlc2lkZW50cyB3aXRoIDIgb3IgbW9yZSB0ZXJtcyBhbmQgdGhvc2Ugd2hvIG9ubHkgaGF2ZSAxIHRlcm0gaW4gb2ZmaWNlLCB3ZSB3aWxsIGdldCBzb21lIGludGVyZXN0aW5nIGZhY3RzIGFib3V0IHRoZXNlIGdyb3VwcyBhbmQgd2UgY2FuIGFsc28gdXNlIHRoZSBwYXR0ZXJuIGV4dHJhY3RlZCBhbnRpY2lwYXRpbmcgdGhlIGZ1dHVyZSBvZiBUcnVtcC4KCkFsc28sIHNvbWUgcGVvcGxlIGJlbGlldmUgdGhhdCBUcnVtcCBpcyBub3QgdGhhdCBzcGVjaWFsIGFzIGEgUmVwdWJsaWNhbiBwcmVzaWRlbnQuIFdoZW4gR2VvcmdlIEJ1c2ggd2FzIGluIGhpcyB0ZXJtLCBoZSBhbHNvIGRpZCBzb21ldGhpbmcgbGF1Z2hhYmxlIGluIHB1YmxpYy4gU28sIHdlIHdpbGwgdGFrZSB0aGlzIGZhY3RvciBpbnRvIGNvbnNpZGVyYXRpb24gYW5kIGZ1cnRoZXIgYnJlYWsgdGhlIGRhdGEgaW50byBkZW1vY3JhdGljIHByZXNpZGVudHMgYW5kIHJlcHVibGljYW4gcHJlc2lkZW50cy4KClwKCgojIyAwIC0gQ2hlY2sgYW5kIGluc3RhbGwgbmVlZGVkIHBhY2thZ2VzLiBBcnJhbmdlIHRoZSBkYXRhLiBMb2FkIHRoZSBsaWJyYXJpZXMgYW5kIGZ1bmN0aW9ucy4gCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpzZXR3ZCgifi9EZXNrdG9wLzUyNDNhZHMvRmFsbDIwMTctUHJvajEtY3cyOTc0IikKcGF0aDwtcGFzdGUwKGdldHdkKCksIi9kYXRhL0luYXVndXJhbFNwZWVjaGVzLyIpCmZvbGRlci5wYXRoPXBhc3RlMChnZXR3ZCgpLCIvZGF0YS9JbmF1Z3VyYWxTcGVlY2hlcy8iKQoKIyMjbG9hZCBwYWNrYWdlcwpwYWNrLnBhdGg9cGFzdGUwKGdldHdkKCksIi9saWIvUGFja2FnZS5SIikKc291cmNlKHBhY2sucGF0aCkKCiMjI3Byb2Nlc3NpbmcgZGF0YQpkYXRhLnBhdGg9cGFzdGUwKGdldHdkKCksIi9saWIvRGF0YS5SIikKc291cmNlKGRhdGEucGF0aCkKCmBgYAoKXApUaGlzIG5vdGVib29rIHdhcyBwcmVwYXJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRhbCBzZXR0aW5ncy4KCgpgYGB7cn0KcHJpbnQoUi52ZXJzaW9uKQpgYGAKCgojIyAxIC0gV29yZENsb3VkCmBgYHtyLGZpZy5oZWlnaHQgPSA0LjUsZmlnLndpZHRoID0gNn0KIyMjZmlyc3RfdGVybV9kZW1vICAgICBzdWJzZXQgb2YgaW5hdWcgbGlzdAojIyNmaXJzdF9kZW1vICAgICAgICAgIG5hbWUKIyMjdGRtX2ZpcnN0X2RlbW8gICAgICB0ZG0gZmlsZSAKCgojIyNXb3JkQ2xvdWQgcGxvdAoKIyMjYWxsCiNvcCA9IHBhcihtZnJvdz1jKDEsMiksbWFyID0gYygwLCAwLCAzLCAwKSkKCnBhcihtZnJvdz1jKDMsMikpCndvcmRjbG91ZCh0ZG1fZmlyc3QkdGVybSwgdGRtX2ZpcnN0JGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlJlZHMiKSkKdGl0bGUobWFpbiA9ICcxIHRlcm0gUHJlc2lkZW50cycpCgp3b3JkY2xvdWQodGRtX3NlY29uZCR0ZXJtLCB0ZG1fc2Vjb25kJGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlB1cnBsZXMiKSkKdGl0bGUobWFpbiA9ICcyIG9yIG1vcmUgdGVybSBQcmVzaWRlbnRzJykKCiMjI2RlbW8Kd29yZGNsb3VkKHRkbV9maXJzdF9kZW1vJHRlcm0sIHRkbV9maXJzdF9kZW1vJGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlJlZHMiKSkKdGl0bGUobWFpbiA9ICdEZW1vY3JhdGljcyBvbmx5IGhhdmUgb25lIHRlcm0nKQoKd29yZGNsb3VkKHRkbV9zZWNvbmRfZGVtbyR0ZXJtLCB0ZG1fc2Vjb25kX2RlbW8kY291bnQsCiAgICAgICAgICBzY2FsZT1jKDIsMC41KSwKICAgICAgICAgIG1heC53b3Jkcz01MCwKICAgICAgICAgIG1pbi5mcmVxPTEsCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsCiAgICAgICAgICByb3QucGVyPTAuMywKICAgICAgICAgIHVzZS5yLmxheW91dD1ULAogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoOSwiUHVycGxlcyIpKQp0aXRsZShtYWluID0gJ0RlbW9jcmF0aWNzIGhhdmUgdHdvIG9yIG1vcmUgdGVybXMnKQoKCiMjI3JlcHViCndvcmRjbG91ZCh0ZG1fZmlyc3RfcmVwdWIkdGVybSwgdGRtX2ZpcnN0X3JlcHViJGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlJlZHMiKSkKdGl0bGUobWFpbiA9ICdSZXB1YmxpY2FuIHdpdGggb25seSBvbmUgdGVybScpCgp3b3JkY2xvdWQodGRtX3NlY29uZF9yZXB1YiR0ZXJtLCB0ZG1fc2Vjb25kX3JlcHViJGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlB1cnBsZXMiKSkKdGl0bGUobWFpbiA9ICdSZXB1YmxpY2FuIHdpdGggdHdvIG9yIG1vcmUgdGVybXMnKQoKCmBgYApcCkFsbCBncm91cHMgaGF2ZSB0aGVpciBvd24gc3BlY2lhbCBXb3JkQ2xvdWRzLCBidXQgd2Ugc3RpbGwgY2FuIGZpbmQgc29tZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9uZS10ZXJtIGFuZCB0d28tdGVybSBwcmVzaWRlbnRzOgoKLSBPbmUtdGVybSBwcmVzaWRlbnRzIHJlZ2FyZGxlc3Mgb2YgcGFydHkgaGF2ZSBtb3JlIHdvcmRzIHRoYXQgcGVvcGxlIGFyZSBnZW5lcmFsbHkgbW9yZSBpbnRlcmVzdGVkIGluLiAiZW1wbG95ZWUiLCJidXNpbmVzcyIsImFtZXJpY2EiIGFyZSB0aGUgd29yZHMgdGhhdCBwZW9wbGUgZ2VuZXJhbGx5IHRoaW5rIHdpbGwgYXBwZWFyIGluIGluYXVndXJhbCBzcGVlY2hlcywgc28gaXQgc2VlbXMgdGhhdCBvbmUtdGVybSBwcmVzaWRlbnRzIHRlbmQgdG8gaW5ncmF0aWF0ZSBjaXRpemVucyBieSB0YWxraW5nIHRoaW5ncyB0aGF0IGFyZSBtb3JlIHJlYWxpc3RpYy4gCi0gVHdvLXRlcm0gcHJlc2lkZW50cyByZWdhcmRsZXNzIG9mIHBhcnR5IGhhdmUgbW9yZSB3b3JkcyBvZiBhYnN0cmFjdCB0aGluZ3MuIFdvcmRzIGxpa2UgInN0cmlja2VuIiwicHJvZHVjdGl2aXR5IiBhbmQgIm1pbm9yaXR5IiBkbyBub3QgcmVsYXRlIHRvIGdlbmVyYWwgY2l0aXplbnMnIGRhaWx5IGxpZmUgdGhhdCBtdWNoLCBidXQgcHJlc2lkZW50cyB0YWxrIG1vcmUgYWJvdXQgdGhvc2UgZXZlbnR1YWxseSBnZXQgdGhlaXIgc2Vjb25kIHRlcm0uCi0gSXQgaXMgcG9zc2libGUgdGhhdCBwZW9wbGUgd2lsbCBwbGFjZSBtb3JlIGhvcGVzIG9uIHByZXNpZGVudHMgdGhhdCBwcm9taXNlIHRvIGltcHJvdmUgZWNvbm9taWNzIG9yIGJyaW5nIG1vcmUgam9icy4gSG93ZXZlciwgaXQgaXMgbm90IGVhc3kgdG8gYWN0dWFsbHkgYWNoaWV2ZSBlY29ub21pYyBwcm9zcGVyaXR5IGFzIGl0IHdpbGwgYWx3YXlzIGJlIGFmZmVjdGVkIGJ5IG1hbnkgY29tcGxpY2F0ZWQgZmFjdG9ycy4gUGVvcGxlIG1pZ2h0IGJlIGRpc2FwcG9pbnRlZCBhZnRlciB0aGV5IGZpbmlzaCB0aGVpciBmaXJzdCB0ZXJtLiBPbiBjb21wYXJpc29uLCBwcmVzaWRlbnRzIHRhbGsgbGVzcyBtaWdodCBnYWluIGxlc3MgcHJlc3N1cmUuCgpcCmBgYHtyfQojIyN0cnVtcAp3b3JkY2xvdWQodGRtLnRydW1wJHRlcm0sIHRkbS50cnVtcCRjb3VudCwKICAgICAgICAgIHNjYWxlPWMoMiwwLjUpLAogICAgICAgICAgbWF4LndvcmRzPTUwLAogICAgICAgICAgbWluLmZyZXE9MSwKICAgICAgICAgIHJhbmRvbS5vcmRlcj1GQUxTRSwKICAgICAgICAgIHJvdC5wZXI9MC4zLAogICAgICAgICAgdXNlLnIubGF5b3V0PVQsCiAgICAgICAgICByYW5kb20uY29sb3I9RkFMU0UsCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg5LCJPcmFuZ2VzIikpCnRpdGxlKG1haW4gPSAnVHJ1bXAgJykKCmBgYApcCgpUcnVtcCBoYXMgYSByZWxhdGl2ZWx5IHNwZWNpYWwgV29yZENsb3VkIGFzIGhlIHRhbGtzIGEgbG90IGFib3V0IE9iYW1hLiBGcm9tIHRoZSBXb3JkQ2xvdWQsIFRydW1wIGhhdmUgd29yZHMgbGlrZSAiYW1lcmljYSIsICJkcmVhbXMiLCAiImpvYnMiIGluZGljYXRpbmcgdGhhdCBoZSB0YWxrcyBtb3JlIGFib3V0IGhvdyB0byBtYWtlIEFtZXJpY2EgdGhyaXZlIGFnYWluIGFuZCBob3cgdG8gYnJpbmcgbW9yZSBqb2JzLiBUcnVtcCBnYWlucyBsb3RzIG9mIHN1cHBvcnQgZnJvbSBibHVlLWNvbGxhcnMgd2hvIHBsYWNlIGhvcGUgb2YgY2hhbmdpbmcgdGhlaXIgbGl2aW5nIHN0YXR1cywgYnV0IGl0IG1pZ2h0IG5vdCBiZW5lZml0IGhpbSB3aGVuIHJ1bm5pbmcgZm9yIGhpcyBzZWNvbmQgdGVybS4KXAoKCiMjIDIgLSBMZW5ndGggb2YgU2VudGVuY2VzIAoKYGBge3IsZmlnLmhlaWdodCA9IDUsZmlnLndpZHRoID0gMTB9CiMjI3NlbnRlbmNlLmxpc3QgICAgICAgICBzZW50ZW5jZSBsaXN0IG9mIGFsbCBmaWxlIGluIGRpcgojIyNzZW50ZW5jZS5saXN0LmFsbCAgICAgc2VudGVuY2UgbGlzdCBvZiBhbGwgZmlsZSBncm91cCBieSBvbmUtdGVybSBhbmQgc2Vjb25kLXRlcm0KIyMjc2V0ZW5jZS5saXN0LmRlbW8KIyMjc2V0ZW5jZS5saXN0LnJlcHViCgoKIyMjYWxsCnNlbnRlbmNlLmxpc3QuYWxsPWZpbHRlcihzZW50ZW5jZS5saXN0LCBGaWxlJWluJWMoZmlyc3RfdGVybSRGaWxlLHNlY29uZF90ZXJtJEZpbGUpKQpzZW50ZW5jZS5saXN0LmFsbCRHcm91cD1pZmVsc2Uoc2VudGVuY2UubGlzdC5hbGwkRmlsZSVpbiVmaXJzdF90ZXJtJEZpbGUsImZpcnN0Iiwic2Vjb25kIikKI3NlbnRlbmNlLmxpc3QuYWxsJGF2Zy53b3JkPC1pZmVsc2Uoc2VudGVuY2UubGlzdC5hbGwkR3JvdXA9PSJmaXJzdCIsc2VudGVuY2UubGlzdC5hbGwkd29yZC5jb3VudC9sZW5ndGgoZmlyc3QpLHNlbnRlbmNlLmxpc3QuYWxsJHdvcmQuY291bnQvbGVuZ3RoKHNlY29uZCkpCgpiZWVzd2FybSh3b3JkLmNvdW50fkdyb3VwLCAKICAgICAgICAgZGF0YT1zZW50ZW5jZS5saXN0LmFsbCwKICAgICAgICAgaG9yaXpvbnRhbCA9IEZBTFNFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YygicmVkIiwicHVycGxlIiksCiAgICAgICAgIGNleD0wLjgsIGNleC5heGlzPTEsIGNleC5sYWI9MS4yLAogICAgICAgICBsYXM9Mix5bGFiPSJOdW1iZXIgb2Ygd29yZHMiLAogICAgICAgICB4bGFiPSIiLGxhcz0xLAogICAgICAgICBtYWluPSJJbmF1Z3VhcnRpb24gc3BlZWNoZXMiKQoKIyMjZGVtbwpzZW50ZW5jZS5saXN0LmRlbW89ZmlsdGVyKHNlbnRlbmNlLmxpc3QsIEZpbGUlaW4lYyhmaXJzdF90ZXJtX2RlbW8kRmlsZSxzZWNvbmRfdGVybV9kZW1vJEZpbGUpKQpzZW50ZW5jZS5saXN0LmRlbW8kR3JvdXA9aWZlbHNlKHNlbnRlbmNlLmxpc3QuZGVtbyRGaWxlJWluJWZpcnN0X3Rlcm1fZGVtbyRGaWxlLCJmaXJzdF9kZW1vIiwic2Vjb25kX2RlbW8iKQojc2VudGVuY2UubGlzdC5kZW1vJGF2Zy53b3JkPC1pZmVsc2Uoc2VudGVuY2UubGlzdC5kZW1vJEdyb3VwPT0iZmlyc3RfZGVtbyIsc2VudGVuY2UubGlzdC5kZW1vJHdvcmQuY291bnQvbGVuZ3RoKGZpcnN0X2RlbW8pLHNlbnRlbmNlLmxpc3QuZGVtbyR3b3JkLmNvdW50L2xlbmd0aChzZWNvbmRfZGVtbykpCmJlZXN3YXJtKHdvcmQuY291bnR+R3JvdXAsIAogICAgICAgICBkYXRhPXNlbnRlbmNlLmxpc3QuZGVtbywKICAgICAgICAgaG9yaXpvbnRhbCA9IEZBTFNFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YygicmVkIiwicHVycGxlIiksCiAgICAgICAgIGNleD0wLjgsIGNleC5heGlzPTEsIGNleC5sYWI9MS4yLAogICAgICAgICBsYXM9Mix5bGFiPSJOdW1iZXIgb2Ygd29yZHMiLAogICAgICAgICB4bGFiPSIiLGxhcz0xLAogICAgICAgICBtYWluPSJJbmF1Z3VhcnRpb24gc3BlZWNoZXMiKQoKIyMjcmVwdWIKc2VudGVuY2UubGlzdC5yZXB1Yj1maWx0ZXIoc2VudGVuY2UubGlzdCwgRmlsZSVpbiVjKGZpcnN0X3Rlcm1fcmVwdWIkRmlsZSxzZWNvbmRfdGVybV9yZXB1YiRGaWxlKSkKc2VudGVuY2UubGlzdC5yZXB1YiRHcm91cD1pZmVsc2Uoc2VudGVuY2UubGlzdC5yZXB1YiRGaWxlJWluJWZpcnN0X3Rlcm1fcmVwdWIkRmlsZSwiZmlyc3RfcmVwdWIiLCJzZWNvbmRfcmVwdWIiKQojc2VudGVuY2UubGlzdC5yZXB1YiRhdmcud29yZDwtaWZlbHNlKHNlbnRlbmNlLmxpc3QucmVwdWIkR3JvdXA9PSJmaXJzdF9yZXB1YiIsc2VudGVuY2UubGlzdC5yZXB1YiR3b3JkLmNvdW50L2xlbmd0aChmaXJzdF9yZXB1Yiksc2VudGVuY2UubGlzdC5yZXB1YiR3b3JkLmNvdW50L2xlbmd0aChzZWNvbmRfcmVwdWIpKQoKYmVlc3dhcm0od29yZC5jb3VudH5Hcm91cCwgCiAgICAgICAgIGRhdGE9c2VudGVuY2UubGlzdC5yZXB1YiwKICAgICAgICAgaG9yaXpvbnRhbCA9IEZBTFNFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YygicmVkIiwicHVycGxlIiksCiAgICAgICAgIGNleD0wLjgsIGNleC5heGlzPTEsIGNleC5sYWI9MS4yLAogICAgICAgICBsYXM9Mix5bGFiPSJOdW1iZXIgb2Ygd29yZHMiLAogICAgICAgICB4bGFiPSIiLGxhcz0xLAogICAgICAgICBtYWluPSJJbmF1Z3VhcnRpb24gc3BlZWNoZXMiKQpgYGAKXApPbmx5IGZpcnN0IGluYXVndXJhbCBzcGVlY2hlcyBhcmUgcGlja2VkLiBUaGVyZSBhcmUgMjMgb25lLXRlcm0gcHJlc2lkZW50cyAqKnZzKiogMTcgc2Vjb25kLXRlcm0gcHJlc2lkZW50czsgOSBvbmUtdGVybSBkZW1vY3JhdGljIHByZXNpZGVudHMgKip2cyoqIDYgdHdvLXRlcm0gZGVtb2NyYXRpYyBwcmVzaWRlbnRzOyAxMCBvbmUtdGVybSByZXB1YmxpY2FuIHByZXNpZGVudHMgKip2cyoqIDcgdHdvLXRlcm0gcmVwdWJsaWNhbiBwcmVzaWRlbnRzLiBBcyB0aGUgbnVtYmVyIG9mIHByZXNpZGVudHMgaW4gZWFjaCBncm91cCBkaWZmZXIsIHRoZSBhbmFseXNpcyBiZWNvbWUgbW9yZSBjb21wbGljYXRlZC4gSG93ZXZlciwgd2UgY2FuIHN0aWxsIHNlZSBzb21lIHBhdHRlcm5zOgoKLSBBbGwgcHJlc2lkZW50cyB3aWxsIGhhdmUgbW9yZSBzZW50ZW5jZXMgd2l0aCBsZW5ndGggYXJvdW5kIDIwLCBoYXZlIHNpbWlsYXIgc2hhcGUgb2YgZGlzdHJpYnV0aW9uIG9mIHNlbnRlbmNlIGxlbmd0aC4KLSBUd28tdGVybSBwcmVzaWRlbnRzIHRlbmRzIHRvIGhhdmUgcmVsYXRpdmVseSBtb3JlIG51bWJlciBvZiBzZW50ZW5jZS4gV2UgY2FuIHNlZSBpdCB0aHJvdWdoIHRoZSBmaXJzdCBwbG90LiBBbHRob3VnaCB0aGVyZSBhcmUgMjMgb25lLXRlcm0gcHJlc2lkZW50cyBidXQgMTcgdHdvLXRlcm0gcHJlc2lkZW50cywgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgbGVzcyBzZW50ZW5jZXMgaW4gdHdvLXRlcm0gcHJlc2lkZW50cy4KLSBUd28tdGVybSBkZW1vY3JhdGljIHByZXNpZGVudHMgaGF2ZSAqKm1vcmUgZXZlbioqIHN0cnVjdHVyZSBvZiBzZW50ZW5jZSBsZW5ndGggY29tcGFyZWQgdG8gb25lLXRlcm0gZGVtb2NyYXRpYyBwcmVzaWRlbnRzLiBIb3dldmVyLCB0d28tdGVybSByZXB1YmxpY2FuIHByZXNpZGVudHMgaGF2ZSAqKmxlc3MgZXZlbioqIHN0cnVjdHVyZSBjb21wYXJlZCB0byBvbmUtdGVybSByZXB1YmxpY2FuIHByZXNpZGVudHMuCgpcCgoKYGBge3J9CgojIyNUcnVtcApzZW50ZW5jZS50bz1maWx0ZXIoc2VudGVuY2UubGlzdCwgRmlsZSVpbiVjKCJEb25hbGRKVHJ1bXAiLCJCYXJhY2tPYmFtYSIpKQpzZW50ZW5jZS50byRHcm91cD1pZmVsc2Uoc2VudGVuY2UudG8kRmlsZT09IkRvbmFsZEpUcnVtcCIsIlRydW1wIiwiT2JhbWEiKQpiZWVzd2FybShzZW50ZW5jZS50byR3b3JkLmNvdW50fkdyb3VwLAogICAgICAgICBkYXRhPXNlbnRlbmNlLnRvLAogICAgICAgICBob3Jpem9udGFsID0gRkFMU0UsCiAgICAgICAgIHBjaD0xNiwgY29sPWJyZXdlci5wYWwoMywiRGFyazIiKSwKICAgICAgICAgY2V4PTAuOCwgY2V4LmF4aXM9MSwgY2V4LmxhYj0xLjIsCiAgICAgICAgIGxhcz0yLHlsYWI9Ik51bWJlciBvZiB3b3JkcyIsCiAgICAgICAgIHhsYWI9IiIsbGFzPTEsCiAgICAgICAgIG1haW49IkluYXVndWFydGlvbiBzcGVlY2hlcyIpCgoKYGBgClwKQ29tcGFyZWQgdG8gT2JhbWEncyBmaXJzdC10ZXJtIGluYXVndXJhbCBzcGVlY2gsIFRydW1wIGhhcyBzb21lIGV4dHJhIGxvbmcgc2VudGVuY2VzLiBUcnVtcCBoYXMgYSBzcGVjaWFsbHkgZXZlbiBzdHJ1Y3R1cmUgb2Ygc2VudGVuY2UgbGVuZ3RoIHdoaWNoIGlzIGNsb3Nlc3QgdGhlIG9uZS10ZXJtIHJlcHVibGljYW4gcHJlc2lkZW50cyBjb21wYXJlZCB0byBvdGhlciBncm91cHMuIAoKClwKCgojIyAzIC0gU2VudGltZW50CmBgYHtyLGZpZy5oZWlnaHQgPSA4LGZpZy53aWR0aCA9IDh9CnBhcihtZnJvdz1jKDMsMikpCgplbW8uYmFycGxvdDwtZnVuY3Rpb24oZ3JvdXAsZGF0YSl7CiAgcGFyKG1hcj1jKDQsIDYsIDIsIDEpKQogIGVtby5tZWFucz1jb2xNZWFucyhzZWxlY3Qoc3Vic2V0KGRhdGEsZGF0YSRHcm91cD09Z3JvdXApLCBhbmdlcjp0cnVzdCk+MC4wMSxuYS5ybT1UUlVFKQogIGJhcnBsb3QoZW1vLm1lYW5zLCBsYXM9MiwgY29sPWJyZXdlci5wYWwoOCwiU2V0MyIpLCBob3Jpej1ULGJvcmRlcj1GLG1haW49Z3JvdXApCn0KCgogIyMjYWxsCmVtby5iYXJwbG90KCJmaXJzdCIsc2VudGVuY2UubGlzdC5hbGwpCmVtby5iYXJwbG90KCJzZWNvbmQiLHNlbnRlbmNlLmxpc3QuYWxsKQoKIyMjZGVtbwplbW8uYmFycGxvdCgiZmlyc3RfZGVtbyIsc2VudGVuY2UubGlzdC5kZW1vKQplbW8uYmFycGxvdCgic2Vjb25kX2RlbW8iLHNlbnRlbmNlLmxpc3QuZGVtbykKCiMjI3JlcHViCmVtby5iYXJwbG90KCJmaXJzdF9yZXB1YiIsc2VudGVuY2UubGlzdC5yZXB1YikKZW1vLmJhcnBsb3QoInNlY29uZF9yZXB1YiIsc2VudGVuY2UubGlzdC5yZXB1YikKCgpgYGAKXAoKV2UgY2FuIHNlZSB0aGF0IHRoZSBkaXN0cmlidXRpb25zIG9mIGVtb3Rpb25zIGFyZSBzaW1pbGFyIGFtb25nIHRob3NlIGdyb3VwczoKCi0gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAqKmpveSBhbmQgZmVhcioqIGhhcyBpdHMgb3duIGRpc3RpbmN0IHBhdHRlcm46IEZyb20gYWxsIHRocmVlIGdyb3VwcyBvZiBjb21wYXJpc29ucywgd2UgY2FuIHNlZSB0aGF0IHByZXNpZGVudHMgd2l0aCAyIG9yIG1vcmUgdGVybXMgd2lsbCBoYXZlIGNsb3NlciBhbW91bnQgb2YgZW1vdGlvbiBjb3JlcyBiZXR3ZWVuIGpveSBhbmQgZmVhciwgd2hpY2ggaXMgdG8gc2F5IHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28gZW1vdGlvbnMgYmVjb21lcyBzbWFsbGVyLgotIEdlbmVyYWxseSwgdHdvLXRlcm0gcHJlc2lkZW50cyB3aWxsIGhhdmUgbW9yZSBlbW90aW9uIG9mICoqc2FkbmVzcyBjb21wYXJlZCB0byBzdXJwcmlzZSoqLCBidXQgb25lLXRlcm0gcmVwdWJsaWNhbiBpcyBhbiBleGNlcHRpb24uIEZvciBvbmUtdGVybSByZXB1YmxpY2FuIHByZXNpZGVudHMsIHRoZXkgaGF2ZSB3ZWlnaCBtb3JlIGVtb3Rpb24gb2Ygc2FkbmVzcy4KCgoKXAoKYGBge3J9CiMjI1RydW1wCiBlbW8ubWVhbnM9Y29sTWVhbnMoc2VsZWN0KHN1YnNldChzZW50ZW5jZS5saXN0LmFsbCxzZW50ZW5jZS5saXN0LmFsbCRQcmVzaWRlbnQ9PSJEb25hbGQgSi4gVHJ1bXAiKSwgYW5nZXI6dHJ1c3QpPjAuMDEsbmEucm09VFJVRSkKIGJhcnBsb3QoZW1vLm1lYW5zLCBsYXM9MiwgY29sPWJyZXdlci5wYWwoOCwiU2V0MyIpLCBob3Jpej1ULGJvcmRlcj1GLCBtYWluPSJEb25hbGQgSi4gVHJ1bXAiKQpgYGAKXApUcnVtcCBoYXMgcmVsYXRpdmVseSBsYXJnZSBkaWZmZXJlbmNlIGJldHdlZW4gam95IGFuZCBmZWFyIGFuZCBsZXNzIGVtb3Rpb24gb2YgZmVhciBpbiBoaXMgaW5hdWd1cmFsIHNwZWVjaCwgYnV0IGhlIGhhcyBmYXIgbGVzcyBlbW90aW9uIG9mIHNhZG5lc3MgY29tcGFyZWQgdG8gc3VycHJpc2UgaW4gaGlzIHNwZWVjaC4KRnJvbSB0aGUgam95IGFuZCBmZWFyIHBhdHRlcm4sIFRydW1wIGhhcyBncmVhdGVyIHBvc3NpYmlsaXR5IHRvIGJlIGEgb25lLXRlcm0gcHJlc2lkZW50LCBidXQgaGUgYWxzbyBnZXRzIHRoZSBjaGFuZ2UgdG8gYmUgdHdvLXRlcm0gcHJlc2lkZW50IGZyb20gc2FkbmVzcyBhbmQgc3VycHJpc2UgcGF0dGVybi4KClwKCgojIyA0IC0gQ29uY2x1c2lvbgpcCgohW10oaHR0cDovL2QzNjY2NzZsODltaXFtLmNsb3VkZnJvbnQubmV0L3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzA4Lzk2OTM5X0RvbmFsZC1UcnVtcC15b3VyZS1maXJlZC0xMDI0eDU5Ny5qcGcpe3dpZHRoPTUwJX0KClwKXApXZSBjYW4gc2VlIHRoYXQgdGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBwYXR0ZXJucyBiZXR3ZWVuIG9uZS10ZXJtIHByZXNlbnRzIGFuZCB0d28tdGVybSBwcmVzaWRlbnQuIApPbmx5IHRocm91Z2ggdGhlIGFuYWx5c2lzIGFib3ZlLCBJIHdpbGwgYW50aWNpcGF0ZSB0aGF0IFRydW1wICoqd2lsbCBub3QqKiBoYXZlIGhpcyBzZWNvbmQgdGVybToKCi0gQSBXb3JkIENsb3VkIG1vcmUgbGlrZSBhIG9uZS10ZXJtIGRlbW9jcmF0aWMgcHJlc2lkZW50Ci0gRXZlbiBzdHJ1Y3R1cmUgb2Ygd29yZCBsZW5ndGggaW4gc2VudGVuY2VzIG1vcmUgbGlrZSBhIG9uZS10ZXJtIHJlcHVibGljYW4gcHJlc2lkZW50Ci0gUmVsYXRpdmVseSBsYXJnZSBhbW91bnQgb2YgZGlmZmVyZW5jZSBiZXR3ZWVuIGZlYXIgYW5kIGpveQoKSG93ZXZlciwgdW50aWwgbm93IHRoZXJlIGlzIG5vdCB5ZXQgYSBzdHJvbmcgY29tcGV0aXRvcnMgYXBwZWFyaW5nLCBhbmQgZXZlbiB3ZWxsLWRlc2lnbmVkIHBvbGxzIGNhbm5vdCBnaXZlIGEgZXhhY3QgYW50aWNpcGF0aW9uIG9mIGVsZWN0aW9uIHJlc3VsdC4gSSBiZWxpZXZlIHdlIGNhbm5vdCBtYWtlIGEgY29uY2x1c2lvbiBieSBvbmx5IHJlZmVyZW5jaW5nIGluYXVndXJhbCBzcGVlY2hlcywgYnV0IGl0IGlzIHN0aWxsIGZ1biB0byBzZWUgdGhpcyBraW5kIG9mIHRoZSBhbmFseXNpcy4KXApcClwKXAoK